package com.sea.base.fragment.opt

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.viewbinding.ViewBinding
import com.sea.base.utils.ViewBindingHelper
import com.sea.base.utils.param.ParamsUtils

/**
 *  基类FragmentItem，创建Fragment见[FragmentItem.createFragment]
 *  @param T 见[vb]，如果真的不想使用，可以直接写[ViewBinding]（此时不能使用[vb]）
 */
abstract class BaseFragmentItem<T : ViewBinding> : FragmentItem() {
    private var _vb: T? = null
    protected val vb get() = _vb ?: throw IllegalStateException("请不要在super.onCreate前调用或者没有正确的泛型T")

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        if (openAutoBindParams()) {
            ParamsUtils.initWithFragmentItem(this)
        }
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val vbClass = ViewBindingHelper.getViewBindingClass<T>(javaClass) ?: throw IllegalArgumentException("没有找到类${this}的ViewBinding，请检查")
        if (vbClass != ViewBinding::class.java) {
            _vb = ViewBindingHelper.getViewBindingInstance(this, layoutInflater, null)
        }
        init(savedInstanceState)
        bindData()
        return _vb?.root
    }

    /**
     * 是否开启参数自动绑定
     */
    protected open fun openAutoBindParams(): Boolean = true

    /**
     * 建议：
     * 1.view初始化,比如是否开启下拉刷新
     * 2.初始数据加载执
     */
    abstract fun init(savedInstanceState: Bundle?)

    /**
     * 建议：
     * 订阅viewModel的数据并进行绑定
     */
    protected abstract fun bindData()
}